/**
 * 快译通 https://www.bilibili.com/video/BV1vs411n7TH/?p=128
 * 1、创建结构体存储单词和翻译
 * 2、读取单词 格式化存储对应的堆空间中
 * 3、单词查找
 * 4、销毁堆空间
 */
#include <stdio.h>
#include <string.h>
#include "quick_translate.h"
#include "../Utils/FileIOUtils.h"

static const int SIZE = sizeof(char) * 100;
static char *FILE_READ_PATH = "../Read_Write_Test/dict.txt";
static char *EXIT_COMM = "comm=exit";
int listSize;

int main() {
    //1.从文件读取单词和翻译
    listSize = GetWord();

    //接收用户输入的单词
    char *word = (char *) malloc(sizeof(char) * 100);
    //根据单词提供翻译
    char *trans = (char *) malloc(sizeof(char) * 100);

    int idx = 0;
    while (1) {
        printf("请输入要查询的单词(以a~z开头), 结束命令(%s):\n", EXIT_COMM);
//        memset(word, 0, 1024);
//        memset(trans, 0, 1024);
//        scanf("%s", word);    //不能接收空格
        //scanf("%[^\n],word"); //可接收空格了
        gets(word);
        //出口
        if (!strcmp(word, EXIT_COMM)) break;

        //格式化 大小写转换
        char c = *word;

        //0-26
        if (c >= 'a' && c <= 'z')
            idx = c - 'a';
        else {
            printf("请输入正确的单词(以a~z开头):\n");
            continue;
        }
        //查找单词对应的翻译
        if (!SearchWord(word, trans, idx))
            printf("%s\n", trans);
        else
            printf("未找到该单词\n");
    }

    free(word);
    free(trans);
    DestorySpace();
    return EXIT_SUCCESS;
}

//1.从文件读取单词和翻译, 单词是从a~z排序的, z后面的是汉字
int GetWord() {
    FILE *file = file_open_r(FILE_READ_PATH);
    if (!file) {
        printf("加载单词库失败\n");
        return -1;
    }
    list = (Dict *) malloc(SIZE);

    char flag = 'a';    //记录当前索引标志位'a'
    int idx = 0;        //字母对应的索引
    int i = 0;          //list 数组下标
    char *temp = (char *) malloc(SIZE);
    while (!file_eof(file)) {
        memset(temp, 0, SIZE);
        char *str0 = file_gets(temp, SIZE, file);
        if (str0 == NULL) {
            //如果读写错误
            int fail0 = file_error(file);
            if (fail0) {
                printf("读出现错误: %d\n", fail0);
                goto FREE_AND_RETURN;
            } else {
                //读没出错, 但读到了文件末尾, 没有数据了
                break;
            }
        }
        //"#a\n", 将最后一个元素'\n'替换成'\0' ==> "#a"
        temp[strlen(temp) - 1] = 0;
        list[i].word = (char *) malloc(sizeof(char) * strlen(temp));
        //temp[1]: "#a" ==> "a", 将单词放在指定堆空间中
        strcpy(list[i].word, &temp[1]);

        //创建索引, 0-25
        if (idx < 26) {
            //如果和上一个单词首字母不同
            if (list[i].word[0] != flag) {
                idx++;  //下一个字母的索引
                indexs[idx] = i;
                flag++;
            }
        }

        //然后再读取翻译的内容
        memset(temp, 0, SIZE);
        //"Trans:art. 一;字母A\n"
        file_gets(temp, SIZE, file);
        //将最后一个元素'\n'替换成'\0' ==> "Trans:art. 一;字母A"
        temp[strlen(temp) - 1] = 0;
        list[i].trans = (char *) malloc(sizeof(char) * strlen(temp) - 5);
        //temp[6]: art. 一;字母A
        strcpy(list[i].trans, &temp[6]);
        //读取下一个字母&翻译
        i++;
    }

    //将最后一个单词读完后赋值
    indexs[idx + 1] = i;

    for (int j = 0; j < 26; ++j) {
      printf("%02d. %c: start = %d, end = %d\n", j + 1, 'a' + j, indexs[j], indexs[j + 1]);
    }
    for (int j = 0; j < i; j++) {
      printf("list[%d] = {%-8s, %s}\n", j, list[j].word, list[j].trans);
    }

    //释放和关闭文件
    FREE_AND_RETURN:
    free(temp);
    file_close(file);
    return i;
}

/**
 * 根据 单词/汉字 查找
 * @param word 单词
 * @param trans 汉字
 * @param idx 索引, 0~26
 * @return 0成功, 否则失败
 */
int SearchWord(char *word, char *trans, int idx) {
    if (!word || !trans) {
        printf("查询参数为空, 请检查是否初始化!\n");
        return -1;
    }
    for (int i = indexs[idx]; i < indexs[idx + 1]; i++) {
        //如果用户输入的单词和词库中相同返回单词对应的翻译
        if (!strcmp(word, list[i].word)) {
            strcpy(trans, list[i].trans);
            return EXIT_SUCCESS;
        }
    }
    return 1;
}

//数据销毁
void DestorySpace() {
    for (int i = 0; i < listSize; i++) {
        free(list[i].word);
        free(list[i].trans);
    }
    free(list);
    list = NULL;
}